package com.example;

import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.stereotype.Service;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;


/**
 * RequestRateLimiterGatewayFilterFactory
 * 限制同一个IP的请求次数
 *
 * 创  建   时  间： 2020/8/15
 * 版           本: V1.0
 * 作           者: qixin
 * 版  权   所  有: 版权所有(C)2019-2029
 * 公           司: 深圳市七智星科技有限公司
 */
@Service
public class IpAddressKeyResolver implements KeyResolver{
    /**
     * KeyResolver的默认实现是 PrincipalNameKeyResolver，它会从
     * ServerWebExchange检索Principal并调用Principal.getName
     * 在默认情况下，如果KeyResolver没有获取到key，请求将被拒绝。我们可以通过下面这两个属性来调整
     *  spring.cloud.gateway.filter.request-rate-limiter.denyEmptyKey，是否允许空的key
     *  spring.cloud.gateway.filter.request-rate-limiter.emptyKeyStatus，当deny-empty- key=true时返回
     *  的HttpStatus，默认为FORBIDDEN(403,"Forbidden")
     */
    @Override
    public Mono<String> resolve(ServerWebExchange exchange) {
        // 根据请求IP来限流
        return Mono.just(exchange.getRequest()
                .getRemoteAddress()
                .getAddress()
                .getHostAddress());
    }

}
